進入 Design and Declarations 章節的後半段。今天工作繁雜,忙得像一顆纏繞打轉的 Yoyo 溜溜球。沒太多精力看書做筆記,這次就言簡意賅地講述重要觀念吧!
將 class 中所有成員變數聲明為 private
,以加強封裝性及安全性。這種方式可以強制使用者僅通過提供的 interface 使用成員,使 class 的內部實現細節與外部程式隔離。如果需要修改 class 的內部結構,外部程式碼只需重新編譯而無需改動。public
和 protected
則可對封裝性部分開放。
將高層級函式儘量設置為非成員函式。低層級函式需要直接訪問 private
成員,而高層級函式只是調用這些低層級函數。將高層級函數移出 class 的好處包括:
namespace
中。在 C++ 中使用 +
、-
、*
、/
等運算符重載時,如果希望左右兩邊的操作數都能進行隱式轉換,應將該運算符定義為非成員函式,並根據需要設置為 friend
以獲取成員訪問權。
成員函式的左操作數固定為 this
當前對象,不能隱式轉換;而非成員函數的兩個參數都可以被隱式轉換。例如,x + 2
可以轉換,但 2 + x
可能無法正常編譯。這讓自定義類型更像內建類型一樣方便使用。
此外,對單參數建構函式使用 explicit
可禁止隱式轉換。
swap
swap
函數最初由 STL 引入,是處理異常安全性與解決自賦值問題的關鍵機制。其基本實現透過複製建構與賦值運算,可能導致效率低下且缺乏安全性。對於自定義的 class,應提供更高效且不拋出異常的 swap
實現。
使用下列方式可確保程式的穩定性與高效性,並兼容多種 swap
行為:
swap
成員函式,確保交換操作高效並且不拋出異常。namespace
下提供非成員 swap
函式,該函式應調用成員函式實現。swap
成員函式。swap
時,先用 using std::swap
讓 std::swap
在 scope 內可見,讓編譯器選擇最適合的實現。